package model;



import java.util.LinkedList;

import view.VistaNave;

import fiuba.algo3.titiritero.modelo.ObjetoPosicionable;
import fiuba.algo3.titiritero.modelo.ObjetoVivo;


public abstract class Nave implements ObjetoVivo, ObjetoPosicionable, Observable{

	Velocidad velocidad;
	Posicion posicion;
	Posicion posicionAnterior;
	Trayectoria trayectoria;
	boolean estaEnVuelo;
	private boolean seleccionado;
	LinkedList<VistaNave> listaObservadores;
	int alto;
	int ancho;
	

	public Nave(){
		/*Toda nave se crea con velocidad CERO por defecto*/
		this.posicion = Posicion.generarPosicionEnBordes();
		this.posicionAnterior = null;
		this.estaEnVuelo = true;
		this.trayectoria = new Trayectoria();
		this.velocidad = new Velocidad(0);
		this.seleccionado = false;
		this.listaObservadores = null;
		this.alto = 20;
		this.ancho = 20;
		listaObservadores = new LinkedList<VistaNave>();
	}
	
	public void seleccionar() {
		for(VistaNave observador: listaObservadores){
			observador.update();
		}
		this.seleccionado = true; 
	}
	
	public void desseleccionar() {
		for(VistaNave observador: listaObservadores){
			observador.update();
		}
		this.seleccionado = false; 
		}
	
	public Velocidad getVelocidad(){
		
		return this.velocidad;
		
	}
	
	public void setVelocidad(Velocidad velocidad) {
		
		this.velocidad = velocidad;
		
	}
	
	public void frenarNave() {
		/*Le asigna velocidad cero a una nave*/
		Velocidad unaVelocidad = new Velocidad (0);
		this.setVelocidad(unaVelocidad);
		
	}
	
	public Posicion getPosicion() {	return this.posicion;}
	
	public Posicion getPosicionAnterior() { return this.posicionAnterior;}
	
	public void setPosicion(Posicion unaPosicion) { this.posicion = unaPosicion;}
	
	public void setPosicionAnterior (Posicion unaPosicion) { this.posicionAnterior = unaPosicion;}
	
	public boolean estaVolando() {return this.estaEnVuelo;}
	
	public void descenderNave() {this.estaEnVuelo = false;}
	
	public void moverA(Posicion unaPosicion) {
		this.trayectoria.agregarTramo(this.getPosicion(), unaPosicion);
		this.mover();
		}
	
	public void mover() {
		Posicion posicionAnteriorAuxiliar = this.getPosicionAnterior();
		Posicion posicionActualAuxiliar = this.getPosicion();
		this.setPosicionAnterior(this.getPosicion());
		this.setPosicion(this.trayectoria.getSiguietePosicion(posicionActualAuxiliar,posicionAnteriorAuxiliar));
	}
	
	public void aterrizarEn(EspacioDeAterrizaje unEspacio){}
	
	public void addObserver(VistaNave obs ) {
		this.listaObservadores.add(obs);
	}
	
	public void deleteObserver(VistaNave obs) {
		this.listaObservadores.remove(obs);
		
	}
	
	public int getAncho() { return this.ancho;}
	
	public int getAlto() { return this.alto; }
	
	//public static int getAncho() { return ANCHO;}
	
	//public static int getAlto() { return ALTO;}
	
	public void deleteObservers() {
		this.listaObservadores.clear();
		
	}
	
    public int countObserver() {
    	return this.listaObservadores.size();
    }

	public VistaNave getVista() {
		
		return this.listaObservadores.getFirst();
	}
    
	public boolean estaSeleccionado() { return this.seleccionado; }
	
	public boolean estaOcupandoPosicion(Posicion posicion){
		
		// si x menor x+(ancho/2) & x> (x-ancho/2)
		int posX = this.getPosicion().getX();
		int posY = this.getPosicion().getY();
		int rangoAncho = this.getAncho()/2;
		int rangoAlto = this.getAlto()/2;
		
		boolean condicion1 = posicion.getX()<=(posX+rangoAncho);
		boolean condicion2 = posicion.getX()>=(posX-rangoAncho);
		boolean condicion3 = posicion.getY()<=(posY+rangoAlto);
		boolean condicion4 = posicion.getY()>=(posY-rangoAlto);
		
		return condicion1&&condicion2&&condicion3&&condicion4;
				
		 
	}
}
